#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct LinkNode 
{
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct 
{
    LinkNode *front,*rear;
}Link_Queue;

void Init_Queue(Link_Queue *Q)
{
    (*Q).front=(*Q).rear=(LinkNode*)malloc(sizeof(LinkNode));
    (*Q).front->next=NULL;
}

bool Is_Empty(Link_Queue Q)
{
    if(Q.front==Q.rear) return true;
    else return false;
}

void En_Queue(Link_Queue *Q,int x)
{
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    (*Q).rear->next=s;
    (*Q).rear=s;
}

bool De_Queue(Link_Queue *Q,int *x)
{
    if((*Q).front==(*Q).rear) return false;
    LinkNode *p=(*Q).front->next;
    *x=p->data;
    (*Q).front->next=p->next;
    if((*Q).rear==p)
        (*Q).rear=(*Q).front;
    free(p);
    return true;
}

bool Get_Queue_Front(Link_Queue Q, int *x)
{
    if (Is_Empty(Q))
    {
        printf("队列为空，无法获取队首元素\n");
        return false;  
    }
    *x = Q.front->next->data;
    return true; 
}

void Print_Queue(Link_Queue Q) {
    if (Is_Empty(Q)) {
        printf("队列为空，无元素可打印\n");
        return;
    }

    LinkNode *p = Q.front->next; 
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main(){
    Link_Queue Q;
    int x=0,t=0;
    Init_Queue(&Q);
    Print_Queue(Q);
    En_Queue(&Q,1);
    En_Queue(&Q,2);
    En_Queue(&Q,3);
    De_Queue(&Q,&x);
    Print_Queue(Q);
    Get_Queue_Front(Q,&t);
    printf("%d\n",t);

    return 0;
}

